package cn.iot.netty;
import cn.iot.netty.util.NettyMessageDecoder;
import cn.iot.netty.util.NettyMessageEncoder;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.timeout.IdleStateHandler;
import java.util.concurrent.TimeUnit;


public class NettyServerInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        // 添加一个字符串解码器，用于将接收到的ByteBuf转换成字符串
        // 这里假设使用的是UTF-8字符集
        pipeline.addLast("decoder", new NettyMessageDecoder());
        // 添加一个字符串编码器，用于将发送的字符串转换成ByteBuf
        // 这样服务器发送字符串时，客户端可以直接接收到字符串
        pipeline.addLast("encoder", new NettyMessageEncoder());
        {
            // 通道10S钟空闲就会触发 NettyServerHandler.userEventTriggered 方法
            ch.pipeline().addLast(new IdleStateHandler(10, 0, 0, TimeUnit.SECONDS));
            // 添加自定义的ChannelInboundHandlerAdapter来处理业务逻辑
            //一般情况下一个处理器就够了，两个处理器只是为了试试自定义事件【CustomUserEvent】
            pipeline.addLast(new NettyServerHandler());
//            pipeline.addLast(new ChannelHandler2());
            //注意点：
            //  1、仅当前代码，通道10S钟空闲就会触发 NettyServerHandler.userEventTriggered 方法，但是并不会触发 ChannelHandler2.userEventTriggered 方法
            //     这个是因为没有复写了父类的方法，没有继续调用父类的userEventTriggered方法，业务处理完加上super.userEventTriggered(ctx, evt);
            //     ChannelHandler2.userEventTriggered 方法就可以触发了
            //  2、其他方法的也一样
        }
    }
}
